/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package bftsmart.demo.bftmap;
import java.io.IOException;
import java.util.TreeMap;
import java.util.Random;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class BFTMapClientCloudFIT
{
public static Logger logger;
public static void main(String[] args) throws NumberFormatException
{
if(args.length < 4)
{
System.out.println("Usage: java KVClients <number clients> <process id base> <time for running (sec)");
System.exit(-1);
}
//get arguments
int numberClients = Integer.parseInt(args[0]);
int idBase = Integer.parseInt(args[1]);
int timeSec = Integer.parseInt(args[2]);
//init log
initLog();
//create the BFTMapInteractiveClient threads
KVClientInstance [] list = new KVClientInstance[numberClients];
for(int i = 0 ; i < list.length ; i ++)
{
list[i] = new KVClientInstance(idBase + i);
list[i].start();
}
//leave the threads processing for a while
try
{
Thread.sleep(timeSec * 1000);
} catch (InterruptedException e) {}
System.out.println("Stop running...");
//stop and wait for the threads
for(int i = 0 ; i < list.length ; i ++)
{
list[i].stopRun();
try {
list[i].join();
} catch (InterruptedException e) {}
}
System.out.println("Test ended...exit!");
System.exit(0);
}
private static void initLog()
{
try {
boolean append = true;
FileHandler fh = new FileHandler(BFTMapClientCloudFIT.class.getName()+".log", append);
fh.setFormatter(new SimpleFormatter());
logger = Logger.getLogger(BFTMapClientCloudFIT.class.getName());
logger.addHandler(fh);
}
catch (IOException e) {
System.out.println("PROBLEMS]: "+e.getMessage());
System.exit(-1);
}
}
}
class KVClientInstance extends Thread{
private int inc;
private int id;
private boolean run;
private Random rand;
public KVClientInstance(int id)
{
this.id = id;
this.inc = 0;
this.run = true;
this.rand = new Random(id);
}
public void run()
{
BFTMap bftMap = new BFTMap(id);
String tableName = "table-"+id;
try {
createTable(bftMap,tableName);
} catch (Exception e1) {
System.out.println("Problems: Inserting a new value into the table("+tableName+"): "+e1.getLocalizedMessage());
System.exit(1);
}
while(run)
{
try {
boolean result = insertValue(bftMap,tableName);
if(!result)
{
System.out.println("Problems: Inserting a new value into the table("+tableName+")");
System.exit(1);
}
} catch (InterruptedException e) {
System.out.println("Client id["+id+"]: it was interrupted");
run = false;
} catch (Exception e) {
bftMap = new BFTMap(id);
try {
createTable(bftMap,tableName);
} catch (Exception e1) {
System.out.println("Client id["+id+"]: problems");
}
}
}
BFTMapClientCloudFIT.logger.info("Client id["+id+"] operations: "+inc);
return;
}
public void stopRun()
{
this.run = false;
}
private boolean createTable(BFTMap bftMap, String nameTable) throws Exception
{
boolean tableExists;
tableExists = bftMap.containsKey(nameTable);
if (tableExists == false)
bftMap.put(nameTable, new TreeMap<String,byte[]>());
return tableExists;
}
private boolean insertValue(BFTMap bftMap, String nameTable) throws Exception
{
String key = "Key"+rand.nextInt();
String value = Integer.toString(new Random().nextInt());
byte[] valueBytes = value.getBytes();
byte[] resultBytes = bftMap.putEntry(nameTable, key, valueBytes);
if(resultBytes== null)
throw new Exception();
else
inc++;
return true;
}
}